/**
 * Coordenada.java
 * Descripción: Representa la posición del robot o de algún nodo por su fila 
 * y columna.
 * @since 11/11/2012
 * @version 1.0
 * @author Oscar Castañeda, Carnet 11086 
 *         Diego García, Carnet 11360
 *         Luis Carlos Velásquez, Carnet 11085
 *         Sergio Argueta, Carnet 11029
 */

public class Coordenada {
    
    //Valores que denotan la coordenada.
    private int fila, col;
    //Máximo valor que pueden tener los campos de la coordenada.
    private static int maxNumber;
    
    /**
     * Establece cuál es el valor límite para los campos de la coordenada.
     * @param newMaxNumber int que es el valor límite.
     */
    public static void setMaxNumber(int newMaxNumber){
        maxNumber = newMaxNumber;
    }
     
    /**
     * Crea una nueva Coordenada.
     * @param fila Fila para la coordenada.
     * @param col Columna para la coordenada.
     * @pre fila y col deben de ser menores al máximo número de coordenada, que
     *      debería de haber ser definido anteriormente.
     */
    public Coordenada(int fila, int col){       
        this.fila = fila;
        this.col = col;       
    }
    
    /**
     * Devuelve la fila correspondiente a esta coordenada.
     * @return int con la fila.
     */
    public int getFila(){
        return fila;
    }
    
    /**
     * Devuelve la columna corresponiente a esta coordenada.
     * @return int con la columna.
     */
    public int getCol(){
        return col;
    }
       
    /**
     * Genera un número único para una Coordenada.
     * @return int con el Hashcode de la coordenada.
     * @pre Los campos de la coordenada deberían de ser menores que el número máximo permitido para esta.
     * @post Regresa el hashcode de ser la coordenada correcta. -1 en caso contrario.
     */
    @Override
    public int hashCode() {
        if ((fila < maxNumber) && (col < maxNumber)){
            return fila*maxNumber + col;
        }else{
            return -1;
        }        
    }
    
    /**
     * Permite establecer si esta coordenada es igual a otra.
     * @param otraCoordenada Coordenada con la cual se comparará esta.
     * @return true si las coordenadas son iguales; false en caso contrario.
     */
    @Override
    public boolean equals(Object otraCoordenada){
        return ((this.getFila() == ((Coordenada)otraCoordenada).getFila())&&(this.getCol() == ((Coordenada)otraCoordenada).getCol()));
    }  
    
    /**
     * Devuelve la coordenada identificada por el hashCode ingresado.
     * @param hashCode int con el hashCode de una coordenada.
     * @return Coordenada a la cual le corresponde el hashCode.
     */
    public static Coordenada dehash(int hashCode){
        int fila = hashCode/maxNumber;
        int col = hashCode%maxNumber;
        Coordenada aDevolver = new Coordenada(fila, col);
        return aDevolver;
    }
    
}